Skip to content

Uncachers#91

Merged
AlexeyDsov merged 2 commits intoonPHP:masterfrom
AlexeyDsov:uncachersSelf
Jul 3, 2012
Merged

Uncachers#91
AlexeyDsov merged 2 commits intoonPHP:masterfrom
AlexeyDsov:uncachersSelf

Conversation

@AlexeyDsov
Copy link
Member

По мотивам тикетов о TaggableDaoWorker'е (#85) и о позднем раскешивании в случае транзакции (#84). Собственно код вычленен из #85, т.к. вполне идет на отдельный request.

Проблемы которые надо было решить:

  1. Возникла потребность раскешивать объект после изменения по его старому состоянию (до изменения) и новому. Соотвественно старое состояния неоткуда брать.
  2. В случае если добавления/изменения/удаления объектов происходят внутри транзакции, то после завершения транзакции необходимо выполнить раскешивания. Если это будет сделано до commit'а, то какой-либо параллельный процесс может снова закешить неправильные данные, т.к. в postgres по умолчанию уровень изоляции read commited то как только происходит commit - самое время делать uncache, т.к. изменения будут доступны другим транзакциям.

Что и как сделано:

  1. Добавлен интерфейс UncacherBase с методами merge и uncache.
    • merge подразумевает возможность слияния двух uncacher'ов одного типа в один
    • uncache - вызывает раскешивание
  2. Создано несколько Uncacher'ов под интерфейс для различных DAO и DaoWorker'ов, настраиваются они через constructor
  3. Добавлен метод в интерфейс BaseDao::getUncacherById - должен возвращать Uncacher для раскешивания конкретного идентификатора.
  4. GenericDAO и все DaoWorker'ы теперь реализуют этот интерфейс, а методы uncacheById и uncacheByIds используют теперь getUncacherById и вызывают у него uncache.
  5. UncacherGenericDao при вызове метода uncache регистрирует uncacher'ы воркеров в соотвествующих DB, которые в свою очередь либо их сразу вызывают (если вне транзакции), либо собирают с помощью UncachersPool и раскешивают после вызова commit/rollback.

Собственно что меня сейчас смущает в написанном мною:

  1. нужно ли в случае транзакции делать раскешивание не только после коммит'а но и сразу как только произошла регистрация uncacher'а в DB (сейчас раскешивание делается дважды, но не уверен что в этом есть толк)
  2. нужно ли в случае rollback делать раскешивание
  3. на данный момент я сделал для работоспособности только getUncacherById, т.к. именно он вызывается автоматически при изменениях объектов.
  4. Названия новых классов/методов обсуждаемы/изменяемы ;)

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants